﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using SGT.Datos;

namespace SGT.Model
{
    class ManejadorDepositos
    {
        public static ObservableCollection<Deposito> GetDepositos()
        {
            ObservableCollection<Deposito> depositos = new ObservableCollection<Deposito>();
            SGT_DB modelo = new SGT_DB();
            var lista = (from d in modelo.Deposito
                         select new Deposito
                         {
                             DepositoID = d.DepositoID,
                             Direccion = d.Direccion,
                             Nombre = d.Nombre,
                         }).ToList();

            foreach (Deposito d in lista)
            {
                d.ColeccionSectores = ManejadorDepositos.GetSectores(d.DepositoID);
                depositos.Add(d);
            
            }
            modelo.Dispose();
            return depositos;
        }

        public static ObservableCollection<Mercaderia> GetMercaderias()
        {
            ObservableCollection<Mercaderia> mercaderias = new ObservableCollection<Mercaderia>();
            SGT_DB modelo = new SGT_DB();
            var lista = (from m in modelo.Mercaderia
                         select new Mercaderia
                         {
                             Nombre = m.Nombre,
                             Densidad = (double)m.Densidad,
                             MercaderiaID = m.MercaderiaID
                         }).ToList();
            foreach (Mercaderia m in lista)
            {
                mercaderias.Add(m);
            }
            modelo.Dispose();
            return mercaderias;
        }

        public static void InsertarMercaderia(Mercaderia m)
        {
            SGT_DB modelo = new SGT_DB();
            Datos.Mercaderia nueva = new Datos.Mercaderia();
            nueva.Nombre = m.Nombre;
            nueva.Densidad = m.Densidad;
            modelo.AddToMercaderia(nueva);
            modelo.SaveChanges();
        }

        private static ObservableCollection<Sector> GetSectores(int DepositoID)
        {
            ObservableCollection<Sector> sectores = new ObservableCollection<Sector>();
            SGT_DB modelo = new SGT_DB();
            var lista = (from c in modelo.Sector
                         where c.DepositoID == DepositoID
                         select new Sector
                         {
                             Capacidad = (double)c.Capacidad,
                             Nombre = c.Nombre,
                             UsoActual = (double)c.UsoActual,
                             TipoMercaderia = new Mercaderia
                                             {
                                                 Nombre = c.Mercaderia.Nombre,
                                                 Densidad = (double)c.Mercaderia.Densidad,
                                                 MercaderiaID = c.Mercaderia.MercaderiaID
                                             },
                             SectorID = c.SectorID
                         }).ToList();
            foreach (Sector s in lista)
            {
                sectores.Add(s);
            }
            modelo.Dispose();
            return sectores;
        }

        public static void InsertarDeposito(Deposito d)
        {
            SGT_DB modelo = new SGT_DB();
            Datos.Deposito nuevo = new Datos.Deposito();
            nuevo.Direccion = d.Direccion;
            nuevo.Nombre = d.Nombre;
            nuevo.Sector = new System.Data.Objects.DataClasses.EntityCollection<Datos.Sector>();
            foreach (Sector s in d.ColeccionSectores)
            {
                Datos.Sector nuevoSector = new Datos.Sector();
                nuevoSector.Capacidad = s.Capacidad;
                nuevoSector.Nombre = s.Nombre;
                nuevoSector.UsoActual = 0;
                nuevoSector.Deposito = nuevo;
                nuevoSector.Mercaderia = (from m in modelo.Mercaderia
                                         where m.MercaderiaID == s.TipoMercaderia.MercaderiaID
                                         select m).Single();
                nuevo.Sector.Add(nuevoSector);
                modelo.AddToSector(nuevoSector);
            }
            modelo.AddToDeposito(nuevo);
            modelo.SaveChanges();
        }

        public static ObservableCollection<Grafica> GetGraficas()
        {
            ObservableCollection<Grafica> Charts = new ObservableCollection<Grafica>();
            SGT_DB modelo = new SGT_DB();
            var par = (from d in modelo.Configuraciones
                       where d.Parametro == "DepositoActual"
                            select d).Single();
            int DepositoID = Int32.Parse(par.Valor);
            

            foreach (Sector s in GetSectores(DepositoID))
            {
                Grafica g = new Grafica();
                g.Titulo = s.Nombre;
                g.ListaSectores = new ObservableCollection<Sector>();
                g.ListaSectores.Add(s);
                Charts.Add(g);
            }
            modelo.Dispose();
            return Charts;
        }

        public static Grafica GetGraficaDeposito()
        {
            Grafica g = new Grafica();
            SGT_DB modelo = new SGT_DB();
            var par = (from d in modelo.Configuraciones
                       where d.Parametro == "DepositoActual"
                       select d).Single();
            int DepositoID = Int32.Parse(par.Valor);

            g.Titulo = "Estado global";
            g.ListaSectores = new ObservableCollection<Sector>();
            foreach (Sector s in GetSectores(DepositoID))
            {
                g.ListaSectores.Add(s);
            }
            modelo.Dispose();
            return g;
        }

        public static Grafica GetGrafica(int id)
        {
            Grafica salida = new Grafica();
            SGT_DB modelo = new SGT_DB();
            var sector = (from s in modelo.Sector
                        where s.SectorID == id
                        select s).Single();
            Sector s1 = new Sector
            {
                Nombre = sector.Nombre,
                Capacidad = (double)sector.Capacidad,
                UsoActual = (double)sector.UsoActual,
                TipoMercaderia = new Mercaderia
                                             {
                                                 Nombre = sector.Mercaderia.Nombre,
                                                 Densidad = (double)sector.Mercaderia.Densidad,
                                                 MercaderiaID = sector.Mercaderia.MercaderiaID
                                             },
                SectorID = sector.SectorID
            };
            salida.Titulo = sector.Nombre;
            salida.ListaSectores = new ObservableCollection<Sector>();
            salida.ListaSectores.Add(s1);

            modelo.Dispose();
            return salida;
        }


        public static void EstablecerDepositoActual(Deposito dActual)
        {
            SGT_DB modelo = new SGT_DB();
            Configuraciones par = (from d in modelo.Configuraciones
                       where d.Parametro == "DepositoActual"
                       select d).Single();
           
            par.Valor = dActual.DepositoID.ToString();
            modelo.SaveChanges();


        }

        public static Deposito GetDepositoActual()
        {
            SGT_DB modelo = new SGT_DB();
            var par = (from d in modelo.Configuraciones
                       where d.Parametro == "DepositoActual"
                       select d).Single();
            int id = Int32.Parse(par.Valor);
            Deposito actual = (from d in modelo.Deposito
                               where d.DepositoID == id
                               select new Deposito
                               {
                                   DepositoID = d.DepositoID,
                                   Direccion = d.Direccion,
                                   Nombre = d.Nombre
                               }
                               ).Single();
            actual.ColeccionSectores = GetSectores(id);
            return actual;

        }

        public static ASector GetArbolSectoresDepositoActual()
        {
            Deposito d = ManejadorDepositos.GetDepositoActual();
            ASector raiz = new ASector();

            raiz.Nombre = "Remitos";
            raiz.Imagen = "Img/folder.ico";
            
            ASector entradas = new ASector();
            entradas.Nombre = "Entradas";
            entradas.Imagen = "Img/folder.ico";
            
            ASector salidas = new ASector();
            salidas.Nombre = "Salidas";
            salidas.Imagen = "Img/folder.ico";
            ASector puerto = new ASector();
            puerto.Nombre = "De puerto";
            puerto.Imagen = "Img/folder.ico";
            raiz.Hijos.Add(entradas);
            raiz.Hijos.Add(salidas);
            raiz.Hijos.Add(puerto);

            foreach (Sector s in d.ColeccionSectores)
            {
                
                entradas.Hijos.Add(new ASector
                {
                    Nombre = s.Nombre,
                    SectorID = s.SectorID,
                    UsoActual = s.UsoActual,
                    Capacidad = s.Capacidad,
                    Tipo = "Entrada",
                    Imagen ="Img/folder.ico",
                    Mostrar = true
                });
                salidas.Hijos.Add(new ASector
                {
                    Nombre = s.Nombre,
                    SectorID = s.SectorID,
                    UsoActual = s.UsoActual,
                    Capacidad = s.Capacidad,
                    Tipo = "Salida",
                    Imagen = "Img/folder.ico",
                    Mostrar = true
                });

                
            }
            return raiz;
        }

    }
}
